package com.zp.self.module.level_4_算法练习.数据结构.栈与队列;

/**
 * @author By ZengPeng
 */
public class 力扣_482_密钥格式化 {
    //测试
    public static void main(String[] args) {

        System.out.println(new 力扣_482_密钥格式化().licenseKeyFormatting("5F3Z-2e-9-w",4));
        System.out.println(new 力扣_482_密钥格式化().licenseKeyFormatting("2-5g-3-J",2));
    }

    /**
     * 题目：给定一个许可密钥字符串 s，仅由字母、数字字符和破折号组成。字符串由 n 个破折号分成 n + 1 组。你也会得到一个整数 k 。
     * 我们想要重新格式化字符串 s，使每一组包含 k 个字符，除了第一组，它可以比 k 短，但仍然必须包含至少一个字符。
     * 此外，两组之间必须插入破折号，并且应该将所有小写字母转换为大写字母。
     * 返回 重新格式化的许可密钥 。
     *
     * 示例 1：
     * 输入：S = "5F3Z-2e-9-w", k = 4
     * 输出："5F3Z-2E9W"
     * 解释：字符串 S 被分成了两个部分，每部分 4 个字符；
     *      注意，两个额外的破折号需要删掉。
     *
     * 分析：【perfect】
     *      1.替换掉-  ，遍历字符串，利用SB的insert方法插入-
     *      2.stack 转换 ,遍历两次。稍微快一点点 【因为String.toUpperCase() 可能有点慢，判断有点多，有时间看看源码】
     *      3.题解：可以只从后遍历一次 利用SB的append方法插入,再倒转
     * 边界值 & 注意点：
     *      1.
     **/
    public String licenseKeyFormatting(String s, int k) {
        //3.题解：可以只遍历一次
        StringBuilder sb = new StringBuilder();
        int a=k;
        for (int i = s.length() - 1; i >= 0; i--) {
            if (s.charAt(i) != '-') {
                if ( a--== 0) {
                    sb.append("-");a=k-1;
                }
               sb.append(Character.toUpperCase(s.charAt(i)));
            }
        }
        return sb.reverse().toString();
        //2.stack 转换
        /*Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            if('-'!=s.charAt(i))stack.push(Character.toUpperCase(s.charAt(i)));
        }
        StringBuilder sb = new StringBuilder();
        int a=k;
        while (!stack.isEmpty()){
            if(a--==0) {
                sb.append("-");a=k;
            }else
                sb.append(stack.pop());
        }
        return  sb.reverse().toString();*/

        //1.替换掉-  ，遍历字符串，利用SB的insert方法插入-
       /* StringBuilder sb = new StringBuilder(s.replace("-",""));
        int a=k;
        for (int i = sb.length()-1; i>0 ; i--) {
             a--;
             if(a==0) {
                 sb.insert(i,"-");a=k;
             }
        }
        return sb.toString().toUpperCase();*/

    }
}
